package com.chinairi.mall.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.chinairi.mall.controller.viewobject.*;
import com.chinairi.mall.model.ManagerInfo;
import com.chinairi.mall.model.Project;
import com.chinairi.mall.service.modelobject.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 项目表 Mapper 接口
 * </p>
 *
 * @author gsl
 * @since 2020-09-15
 */
public interface ProjectMapper extends BaseMapper<Project> {

    /**
     * 查询企业下项目列表
     *
     * @param projectVO
     * @return
     */
    List<ProjectVO> selectByUciDbId(@Param("projectVO") ProjectVO projectVO,@Param("uciCompCharacter") Integer uciCompCharacter);

    /**
     * 获取库点
     *
     * @return
     */
    List<StorageAddressVO> selectStorage();

    /**
     * 根据企业名称查找项目及订单数/花费数
     *
     * @param allInfoMo
     * @return
     */
    List<AllInfoMO> selectAllInfoOfProject(@Param("search") AllInfoMO allInfoMo);

    /**
     * 用于订单详情展示
     *
     * @param allInfoOfOrderMo
     * @return
     */
    List<AllInfoOfOrderMO> selectAllInfoOfOrder(@Param("search") AllInfoOfOrderMO allInfoOfOrderMo);

    /**
     * 检索订单编号带出项目信息并向redis存放对象
     *
     * @return
     */
    List<PurchaseToProjectRedisMO> selectPurchaseToProjectRedis();

    /**
     * 根据订单id，获取该订单的商品信息
     *
     * @param orderId
     * @return
     */
    List<OrderGoodsVO> getGoodsByOrderId(@Param("orderId") String orderId);

    /**
     * 获取子项目
     *
     * @param pId
     * @return
     */
    List<ProjectVO> selectChildListByPId(@Param("pId") String pId);

    /**
     * 获取所有企业的项目归集
     * @param projectInfoOfAllCompMo
     * @return
     */
    List<ProjectInfoOfAllCompMO> getProjectInfoOfAllComp (@Param("search") ProjectInfoOfAllCompMO projectInfoOfAllCompMo);

    /**
     * 获取某个订单下的实物商品
     * @param goodsInfoOfOrderMo
     * @return
     */
    List<GoodsInfoOfOrderMO> getGoodsInfoOfOrder(@Param("search") GoodsInfoOfOrderMO goodsInfoOfOrderMo);

    /**
     * 获取某个物料的生产信息
     * @param productionInfoOfOrderMo
     * @return
     */
    List<ProductionInfoOfOrderMO> getProductionInfoOfOrder(@Param("search") ProductionInfoOfOrderMO productionInfoOfOrderMo);

    /**
     * 根据需求计划id获取项目地址
     * @param planReqId 需求计划id
     * @return 项目地址
     */
    String getProjectAddress(String planReqId);

    /**
     * 根据项目id查看是否有未完成的订单
     * @param pid 项目id
     * @return 未完成订单数
     */
    Integer getUnDoneOrderByPId(String pid);

    /**
     * 根据企业id查询项目的总入库、出库金额
     * @param uciDbId 企业id
     * @return AllProjectInfoOfCompany
     */
    AllProjectInfoOfCompany getAllProjectInfoOfCompany(String uciDbId);

    /**
     * 根据项目id查询该项目下的所有需求计划信息
     * @param pid 项目id
     * @return 所有需求计划信息
     */
    List<ProjectPlanReqDetailMO> getAllPlanReqDetailInfoOfProject(String pid);

    /**
     * 根据项目id获取未完成的需求计划数
     * @param pId 项目id
     * @return 未完成需求计划数
     */
    Integer getUnDonePlanReqNumber(String pId);

    /**
     * 根据项目id获取已完成的需求计划数
     * @param pId 项目id
     * @return 已完成需求计划数
     */
    Integer getDonePlanReqNumber(String pId);

    /**
     * 根据项目id获取时效正常的订单数
     * @param pId 项目id
     * @return 时效正常的订单数
     */
    Integer getTimeNormalNum(String pId);

    /**
     * 根据项目id获取时效异常的订单数
     * @param pId 项目id
     * @return 时效异常的订单数
     */
    Integer getTimeAbnormalNum(String pId);

    /**
     * 根据项目id以及物资状态查询对应状态的物资数量
     * @param pId 项目id
     * @param qltResult 物资状态 01 合格 02 不合格
     * @return 对应状态的物资数量
     */
    Integer getMaterialNum(@Param("pId") String pId,@Param("qltResult") String qltResult);

    /**
     * 根据企业id查询总需求数
     * @param uciDbId 企业id
     * @return 总需求数
     */
    Integer getAllPlanReqNumByUciDbId(String uciDbId);

    /**
     * 根据企业id查询总项目数
     * @param uciDbId 企业id
     * @return 总项目数
     */
    Integer getAllProjectNumByUciDbId(String uciDbId);

    /**
     * 根据项目id和工序查看物料清单
     * @param pid 项目id
     * @param planProcess 工序 0-完井 1-一开 2-二开 3-三开 4-四开 5-五开
     */
    List<ProjectPlanReqDetailMO> getAllInfoOfBOM(@Param("pid") String pid, @Param("planProcess")String  planProcess);

    /**
     * 根据项目id和物料code查询最近一次下单该物料的订单id
     * @param pid 项目id
     * @param matCode 物料code
     * @return 订单id
     */
    String getOrderIdByMatCode(@Param("pid")String pid, @Param("matCode") String matCode);

    /**
     * 查询项目井别信息
     * @param pid 项目id
     */
    Project getWellInfo(String pid);

    /**
     * 根据项目id和工序查询所需物料数
     * @param pid 项目id
     * @param planProcess 工序
     * @return 总数
     */
    int getReqCountOfBOM(@Param("pid") String pid, @Param("planProcess")String  planProcess);

    /**
     * 查询所有企业、项目、订单等信息
     * @return 所有企业、项目、订单等信息
     */
    AllCompanyInfoVO getAllCompanyInfo();

    /**
     * 查询项目需求计划数
     * @param pId 项目id
     * @return 需求计划数
     */
    Integer getPlanReqNumber(String pId);

    /**
     * 查询物料金额
     *
     * @param pid     项目id
     * @param matCode 物料编码
     * @return 金额
     */
    BigDecimal getMatAmount(@Param("pid") String pid, @Param("matCode") String matCode);

    BigDecimal getGeneralBudgetAmount();

    Integer getXyCompanyTotal();

    Integer getZyCompanyTotal();

    Integer getUnZyCompanyTotal();

    String getBelongTo(String uciDbid);

    BigDecimal getGeneralBudgetAmountByUciDbId(String uciDbid);

    Integer getTotalOrderNum(String uciDbid);

    Integer getTimeNormalNumByUciDbId(String uciDbid);

    Integer getTimeAbnormalNumByUciDbId(String uciDbid);

    Integer getMaterialNumByUciDbId(@Param("uciDbid") String uciDbid, @Param("qltResult") String qltResultt);

    ProjectPlanReqInfoVO getAllPlanReqInfoOfProject(String pid);

    BigDecimal getOrderStorageMoney(String pid);

    BigDecimal getOrderDeliveryMoney(String pid);

    int getPlanReqState(String pid);

    OrderInfoOfPro getOrderInfo(String pid, String state);

    /**
     * 领导驾驶舱数据
     * @return info
     */
    ManagerInfo getManagerInfo();

    Map<String, Object> getReqInfo();
}
